/*
 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.lang.annotation;

/**
 * 此枚举类型的常量提供了注解在Java程序中可能出现的语法位置的简单分类。
 * 这些常量用于{@link Target java.lang.annotation.Target}元注解中，
 * 以指定在何处可以合法地编写给定类型的注解。
 *
 * <p>注解可能出现的语法位置分为<em>声明上下文</em>（注解应用于声明）和
 * <em>类型上下文</em>（注解应用于声明和表达式中使用的类型）。
 *
 * <p>常量{@link #ANNOTATION_TYPE}、{@link #CONSTRUCTOR}、{@link #FIELD}、
 * {@link #LOCAL_VARIABLE}、{@link #METHOD}、{@link #PACKAGE}、
 * {@link #PARAMETER}、{@link #TYPE}和{@link #TYPE_PARAMETER}
 * 对应于JLS 9.6.4.1中的声明上下文。
 *
 * <p>例如，类型被{@code @Target(ElementType.FIELD)}元注解的注解
 * 只能作为字段声明的修饰符编写。
 *
 * <p>常量{@link #TYPE_USE}对应于JLS 4.11中的15个类型上下文，
 * 以及两个声明上下文：类型声明（包括注解类型声明）和类型参数声明。
 *
 * <p>例如，类型被{@code @Target(ElementType.TYPE_USE)}元注解的注解
 * 可以写在字段的类型上（或字段类型内部，如果它是嵌套、参数化或数组类型），
 * 也可以作为类声明等的修饰符出现。
 *
 * <p>{@code TYPE_USE}常量包含类型声明和类型参数声明，
 * 这为为注解类型提供语义的类型检查器设计者提供了便利。
 * 例如，如果注解类型{@code NonNull}被{@code @Target(ElementType.TYPE_USE)}元注解，
 * 那么{@code @NonNull} {@code class C {...}}可以被类型检查器视为指示
 * 类{@code C}的所有变量都是非空的，同时仍然允许其他类的变量
 * 根据{@code @NonNull}是否出现在变量声明处来决定是否为非空。
 *
 * @author  Joshua Bloch
 * @since 1.5
 * @jls 9.6.4.1 @Target
 * @jls 4.1 The Kinds of Types and Values
 */
public enum ElementType {
    /** 类、接口（包括注解类型）或枚举声明 */
    TYPE,

    /** 字段声明（包括枚举常量） */
    FIELD,

    /** 方法声明 */
    METHOD,

    /** 形式参数声明 */
    PARAMETER,

    /** 构造器声明 */
    CONSTRUCTOR,

    /** 局部变量声明 */
    LOCAL_VARIABLE,

    /** 注解类型声明 */
    ANNOTATION_TYPE,

    /** 包声明 */
    PACKAGE,

    /**
     * 类型参数声明
     *
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     * 类型的使用
     *
     * @since 1.8
     */
    TYPE_USE
}
